import types


src = """
msg = 'a module created without a file'

def show():
    print('message:', msg)

def error():
    raise Exception('what is the file name?')
"""

# 创建模块对象
mod_name = 'newmod'
mod_obj = types.ModuleType(mod_name)

# 创建模块代码
mod_file_name = 'fake.py'       # 出现在错误信息中
mod_code = compile(src, mod_file_name, 'exec')

# 运行模块代码，把生成的对象放到模块的名字空间里
exec(mod_code, mod_obj.__dict__)

# 使用这种方法直接运行源代码中的代码，省略了compile的步骤，
# 也可以，不过错误信息中的文件名会有所不同
# exec(src, mod_obj.__dict__)

# 使用模块
mod_obj.show()
mod_obj.error()         # 注意错误信息中的文件名
